﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace GoodTrader.GTDownload
{
    public class CpDownLoadManager
    {
        Thread mDownThreadObject = null;
        public System.Threading.Thread DownThreadObject
        {
            get { return mDownThreadObject; }
            set { mDownThreadObject = value; }
        }
        // 수동이벤트로 신호를 받지 않은 상태로 시작한다.
        private ManualResetEvent mEvent = new ManualResetEvent(false);
        public System.Threading.ManualResetEvent Event
        {
            get { return mEvent; }
            set { mEvent = value; }
        }
        // 다운로드할 객체들의 포인터 리스트
        public List<CpDownLoader> mDownList = new List<CpDownLoader>();
        // 다운로드를 수행할 객체들을 추가한다.
        public void Add(CpDownLoader aDownloader)
        {
            mDownList.Add(aDownloader);
        }

        // 다운로드할 객체들의 순번
        private int mDownNum = 0;
        public int DownNum
        {
            get { return mDownNum; }
            set { mDownNum = value; }
        }

        public void CreateThreadFunc()
        {
            // 쓰레드 객체를 만든다.
            mDownThreadObject = new Thread(new ThreadStart(DownThreadCallBack));
            // 쓰레드를 시작한다.
            mDownThreadObject.Start();
        }

        
        // 다운로드 쓰레드
        // 이벤트가 올 때까지 기다렸다가 
        // 객체를 하나씩 돌아가며 다운로드한다.
        public void DownThreadCallBack()
        {
            while (mDownNum != -1)
            {
                // 이벤트가 신호를 받을 때까지 대기한다.
                // 10초까지 기다려서 이벤트가 오지 않으면 다음으로 진행시킨다.
                bool signaled = mEvent.WaitOne(10000);
                // 객체 목록의 끝에 다다랐을 때는 객체의 처음 목록으로 다시 돌아갑니다.
                if (mDownNum > mDownList.Count - 1)
                    mDownNum = 0;

                // 타임아웃이 발생한 경우임.
                if (signaled == false)
                {
                    mDownNum++;
                    mEvent.Set();
                    continue;
                }
                // 차례가 된 객체에게 다운로드를 허락한다.
                CpDownLoader curObj = mDownList[mDownNum];
                // 활성화 되어 있지 않을 때는 다음 객체로 넘어갑니다.
                if (curObj.Enable == false)
                {
                    mDownNum++;
                    continue;
                }
                // 현재 객체의 다운로드 함수를 실행한다.
                curObj.Download();
                // 다음 순번으로 옮긴다.
                mDownNum++;
            }
        }
    }
}
